
//
//  CZDetailsViewController.swift
//  GZWeibo666
//
//  Created by CAO on 15/12/1.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit
import SVProgressHUD

// 管理 cell重用标示
enum CZStatusDetailIdentifier: String {
    case DetailStatusNormalCell = "DetailStatusNormalCell"  // 原始值
    case DetailStatusForwardCell = "DetailStatusForwardCell"
    case DetailCommentCell = "DetailCommentCell"
//    case DetailLoadingCell = "DetailLoadingCell"
//    case DetailNoDataCell = "DetailNoDataCell"
    
    static func cellId(obj:AnyObject) ->String{
        if obj is CZStatus{
            return (obj as! CZStatus).retweeted_status == nil ? DetailStatusNormalCell.rawValue : DetailStatusForwardCell.rawValue
        }else if obj is CZDetailCommentModel{
//            return (obj as! CZDetailCommentModel).loading ? DetailLoadingCell.rawValue : DetailCommentCell.rawValue
            return DetailCommentCell.rawValue
            
        }
        return "a"
    }
}


class CZDetailsViewController: UIViewController
{

    ///MARK: - 属性
    //微博模型
    private var status : CZStatus
    
    ///评论模型
    private var comments: [CZDetailCommentModel] = [CZDetailCommentModel]() {
        didSet{
            tableView.reloadData()
        }
    }
    
    //MARK: - 构造函数
    init(status: CZStatus)
    {
        self.status = status
        super.init(nibName:nil,bundle:nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    
    override func viewDidLoad()
    {
        super.viewDidLoad()
            title = "微博详情"
//        tabBarController?.tabBar.hidden = true
        prepareUI()
        loadStatusComment()
        prepareTableView()
    }
    
    deinit{
        print("详情控制器销毁")
    }
    
    private func prepareUI(){
        //添加子控件
        view.addSubview(tableView)
//        view.addSubview(bottomView)
        
        //添加约束
        tableView.translatesAutoresizingMaskIntoConstraints = false
        
        //水平方向
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[tv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["tv" : tableView]))
        
        //垂直方向
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[tv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["tv":tableView]))
        
    }
    
    //设置tableView
    private func prepareTableView(){
        //设置背景
        tableView.backgroundColor = UIColor(white: 0.9, alpha: 1)
        
        tableView.estimatedRowHeight = 30
        
        //注册cell
        tableView.registerClass(CZStatusNormalCell.self, forCellReuseIdentifier: CZStatusDetailIdentifier.DetailStatusNormalCell.rawValue)
        
        tableView.registerClass(CZStatusForwardCell.self, forCellReuseIdentifier: CZStatusDetailIdentifier.DetailStatusForwardCell.rawValue)
        
        tableView.registerClass(CZDetailCommentCell.self, forCellReuseIdentifier: CZStatusDetailIdentifier.DetailCommentCell.rawValue)
        
        tableView.delegate = self
        tableView.dataSource = self
        
        //添加上拉刷新控件
        tableView.addInfiniteScrollingWithActionHandler { () -> Void in
        
        }
        tableView.tableFooterView = UIView()
    }
    
    
    func loadStatusComment() {
        // 当第一次进入程序的时候 statuses 为 nil. since_id = 0,加载最新的20条微博数据
        // 当有数据来下拉刷新,获取到第一条微博(第一条微博id最大).返回的数据,就是比第一条微博id还大的微博,就是新数据
        let since_id = comments.first?.id ?? 0
        
        // 加载微博数据
        CZDetailCommentModel.loadComment(status.id, since_id: since_id, max_id: 0) { (comment, total_number, pervious_cursor, next_cursor, error) -> () in
            if error != nil {
                //                print("加载微博数据: \(error)")
            SVProgressHUD.showErrorWithStatus("网络不给力")
                return
            }
        
            let count = comment?.count ?? 0
            
            if count == 0 {
                // 没有新的数据
                return
            }
            
            if since_id > 0 {  // 加载新的微博数据
                // 最终的数据 = 新的数据 + 现有的数据 (可选不能进行操作,需要拆包)
                self.comments = comment! + self.comments
                print("加载到新的数据,拼接到现有数据的前面,总共: \(self.comments.count) 条数据")
            }else{
                // 第一次加载20条数据
                // 赋值给属性
                self.comments = comment!
            }
            
            
        }
    }
//        (since_id, max_id: 0) { (statuses, error) -> () in
//            // 不管有没有获得数据,都关掉刷新控件
//            self.refreshControl?.endRefreshing()
//            
//
//            
//            if since_id > 0 {
//                // 下拉刷新,显示加载了多少条微博数据
//                self.showTipView(count)
//            }
//            
//            // 需要判断是下拉刷新,还是第一次加载20条数据
//            if count == 0 {
//                // 没有新的数据
//                return
//            }
//            
//                    }
//    }

    
    

    

    


    // MARK: - tableView数据源
    /// 返回对应cell的行高
    /// 发现行高调用比较频繁,导致多次调用.计算一次,然后保存起来,下次直接返回缓存的行高
    
 
//     MARK: - 懒加载
    private lazy var tableView = UITableView(frame: CGRectZero, style: UITableViewStyle.Plain)
//
//    /// headView
//    private lazy var detailHeaderView: CZDetailHeaderView = {
//        let view = CZDetailHeaderView()
//        view.delegate = self
//        view.status = self.status
//        
//        return view
//        }()
//    
//    /// 底部View
//    private lazy var bottomView: CZStatusBottomView = {
//        let view = CZStatusBottomView()
//        
//        view.delegate = self
//        
//        return view
//        }()
//
    
}

    //MARK: -扩展 CZStatusDetailViewController  实现UITableViewDelegate和UITableViewDatasource协议
extension CZDetailsViewController:UITableViewDataSource,UITableViewDelegate{

    //设置cell有多少组
    func numberOfSectionsInTableView(tableView: UITableView) -> Int
    {
        return 2
    }
    
    //设置每组cell有多少行
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            //第一组显示微博内容，只有一个cell
            return 1
        }else {
            if comments.count == 0{
                return 1
            }else{
                return comments.count
            }
        }
    }

    
    //设置cell的行高
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // 先看看有没有缓存的行高,如果有缓存行高,直接拿来用,没有的话,在计算,并缓存起来
        // 获取对应的模型
        
        if status.rowHeight != nil {
            //            print("返回会缓存的行高: \(indexPath), rowHeight: \(status.rowHeight!)")
            return status.rowHeight!
        }
        
        // 能到下面来,说明没有缓存的行高
        
        // 获取cell, 计算行高,并不会显示出来
        let cell = CZStatusNormalCell()
        
        // cell计算行高
        let rowHeight = cell.rowHeight(status)
        
        // 缓存行高
        status.rowHeight = rowHeight
        
        // 返回行高
        //        print("计算行高,indexPath: \(indexPath), rowHeight: \(rowHeight)")
        
        return rowHeight
    }
    
    
    //设置cell内容
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        if indexPath.section == 0{
            // 获得模型,模型最清楚要显示什么样的cell
            let cellId = CZStatusDetailIdentifier.cellId(status)
            
            let cell = tableView.dequeueReusableCellWithIdentifier(cellId) as! CZStatusCell
            
            //给cell的status赋值
            cell.status = status
            
            return cell
            
            //设置当前控制器为cell的代理
            
            
            //给cell设置模型，cell根据微博模型显示微博内容
            
        }else
        {
            if comments.count == 0 {
                //根据重用标示获取对应的cell
                return UITableViewCell()
            }else
            {
                let commentModel = comments[indexPath.row]
                //根据平路模型获取cell的重用标示
                let cellId = CZStatusDetailIdentifier.cellId(commentModel)
                
                //根据重用标示获取对应的cell
                let cell = tableView.dequeueReusableCellWithIdentifier(cellId) as! CZDetailCommentCell
                cell.model = commentModel
                return cell
            }
        }
    }

}








